/**
 * @Author: yuanmanxue <yuanmanxue>
 * @Date:   2017-12-12 04:49:14
 * @Last modified by:   yuanmanxue
 * @Last modified time: 2017-12-13 11:37:42
 */

function Watcher (vm, exp, cb) {
    this.cb = cb; //回调函数 updata函数
    this.vm = vm;// vue实例对象
    this.exp = exp;// 观察者列表
    this.value = this.get();  // 将自己添加到订阅器的操作
}

Watcher.prototype = {
    update: function () {
        this.run();
    },
    run: function () {
        var value = this.vm.data[this.exp];
        var oldVal = this.value;
        if (value !== oldVal) {
            this.value = value;
            this.cb.call(this.vm, value, oldVal);
        }
    },
    // dep.target就是watcher观察者的一个实例
    get: function () {
       // dep.taret是类的一个属性，是动态改变的，指向当前watcher对象的本身
        Dep.target = this;  // 缓存自己
        var value = this.vm.data[this.exp];  // 强制执行监听器里的get函数
        Dep.target = null;  // 释放自己
        return value;
    },
};



// function Person() {
//   this.name = this.get();
// }
// Person.prototype={
//   get:function () {
//     abc.target = this;
//     return 'yyyyyy'
//   }
// }
// console.log(abc.target);
